【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0 您所在的位置:网站首页 vivado iddr调用 【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

2023-04-16 07:34| 来源: 网络整理| 查看: 265

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第二十八章 以太网ARP测试实验

在以太网中,一个主机和另一个主机进行通信,必须要知道目的主机的MAC地址(物理地址),而目的MAC地址的获取由ARP协议完成。本章我们来学习如何通过DFZU2EG/4EV MPSoC开发板实现ARP协议的功能。 本章分为以下几个章节: 222828.1简介 28.2实验任务 28.3硬件设计 28.4程序设计 28.5下载验证

28.1简介

ARP概述

ARP(Address Resolution Protocol),即地址解析协议,是根据IP地址(逻辑地址)获取MAC地址的一种TCP/IP协议。在以太网通信中,数据是以“帧”的格式进行传输的,帧格式里面包含目的主机的MAC地址。源主机的应用程序知道目的主机的IP地址,却不知道目的主机的MAC地址。而目的主机的MAC地址直接被网卡接收和解析,当解析到目的MAC地址非本地MAC地址时,则直接丢弃该包数据,因此在通信前需要先获得目的的MAC地址,而ARP协议正是实现了此功能。 ARP协议的基本功能是通过目的设备的IP地址,查询目的设备的MAC地址,以保证通信的顺利进行。MAC地址在网络中表示网卡的ID,每个网卡都需要并有且仅有一个MAC地址。在获取到目的MAC地址之后,将目的MAC地址更新至ARP缓存表中,称为ARP映射,下次通信时,可以直接从ARP缓存表中获取,而不用重新通过ARP获取MAC地址。但一般ARP缓存表会有过期时间,过期后需要重新通过ARP协议进行获取。 ARP映射是指将IP地址和MAC地址映射起来,分为静态映射和动态映射。 静态映射指手动创建一张ARP表,把IP地址和MAC地址关联起来。手动绑定之后,源主机在通信之前,就可以直接从ARP表中直接找到IP地址对应的MAC地址,但这样做有一定的局限性,因为MAC地址可能会变化,比如: 1)机器可能更换NIC(网络适配器),结果变成一个新的物理地址; 2)在某些局域网中,每当计算机加电时,他的物理地址都要改变一次。 3)移动电脑可以从一个物理网络转移到另一个物理网络,这样会改变物理地址。 要避免这些问题出现,必须定期维护更新ARP表,此类比较麻烦而且会影响网络性能。 动态映射指使用协议来获取相对应的物理地址,之所以用动态这个词是因为这个过程是自动完成的,一般应用程序的用户或系统管理员不必关心。已经设计出用于实现动态映射协议的有ARP和RARP(逆地址解析协议)两种,如下图所示。

图 28.1.1 地址解析协议:RAP和RRAP ARP把IP地址映射为物理地址,RARP把物理地址映射为IP地址。RRAP是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或 X终端),此类应用较少,本章不做讨论。 ARP协议分为ARP请求和ARP应答,源主机发起查询目的MAC地址的报文称为ARP请求,目的主机响应源主机并发送包含本地MAC地址的报文称为ARP应答。 当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个ARP请求报文,这个报文包含了发送方的MAC地址和IP地址以及接收方的IP地址。因为发送方不知道接收方的物理地址,所以这个查询分组会在网络层中进行广播,即ARP请求时发送的接收方物理地址为广播地址,用48’hff_ff_ff_ff_ff_ff表示。ARP请求的示意图如下图所示:

图 28.1.2 ARP请求示意图 上图中的主机A发起ARP请求,由于发送的目的MAC地址为广播地址,所以此时局域网中的所有主机都会进行接收并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址。是则返回ARP应答报文,不是则不响应。 只有验证成功的主机才会返回一个ARP应答报文,这个应答报文包含接收方的IP地址和物理地址。ARP应答的示意图如下图所示:

图 28.1.3 ARP应答示意图 主机B利用收到的ARP请求报文中的请求方物理地址,以单播的方式直接发送给主机A,主机A将收到的ARP应答报文中的目的MAC地址解析出来,将目的MAC地址和目的IP地址更新至ARP缓存表中。当再次和主机A通信时,可以直接从ARP缓存表中获取,而不用重新发起ARP请求报文。需要说明的是,ARP缓存表中的表项有过期时间(一般为20分钟),过期之后,需要重新发起ARP请求以获取目的MAC地址。 ARP协议通过以太网进行传输,那么必须也要按照以太网所规定的格式进行传输,我们先来介绍下以太网的帧格式,随后再来向大家详细介绍ARP协议的具体格式。 以太网是目前应用最广泛的局域网通讯方式,同时也是一种协议。以太网协议定义了一系列软件和硬件标准,从而将不同的计算机设备连接在一起。我们知道串口通信单次只传输一个字节,而以太网通信是以数据包的形式传输,其单包数据量达到几十,甚至成百上千个字节。下图为以太网通过ARP传输单包数据的格式,从图中可以看出,以太网的数据包就是对协议的封装来实现数据的传输,即ARP数据位于以太网帧格式的数据段。这里只是让大家了解下以太网数据包的格式,后面会逐个展开来讲。

图 28.1.4 以太网ARP数据包格式 以太网MAC帧格式 以太网技术的正式标准是IEEE 802.3,它规定了以太网传输数据的帧结构,我们可以把以太网MAC层理解成高速公路,我们必须遵循它的规则才能在上面通行,以太网MAC层帧格式如图 28.1.5所示。

图 28.1.5 以太网帧格式 以太网传输数据时按照上面的顺序从头到尾依次被发送和接收,我们下面进一步解释各个区域。 前导码(Preamble):为了实现底层数据的正确阐述,物理层使用7个字节同步码(0和1交替(55-55-55-55-55-55-55))实现数据的同步。 帧起始界定符(SFD,Start Frame Delimiter):使用1个字节的SFD(固定值为0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。 目的MAC地址:即接收端物理MAC地址,占用6个字节。MAC地址从应用上可分为单播地址、组播地址和广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。 源MAC地址:即发送端物理MAC地址,占用6个字节。 长度/类型:上图中的长度/类型具有两个意义,当这两个字节的值小于1536(十六进制为 0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地址解析协议)等。 数据:以太网中的数据段长度最小46个字节,最大1500个字节。最大值1500称为以太网的最大传输单元(MTU,Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素,因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置,通常以太网的有效数据字段小于1500个字节。 帧检验序列(FCS,Frame Check Sequence):为了确保数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。 在这里还有一个要注意的地方就是以太网相邻两帧之间的时间间隔,即帧间隙(IFG,Interpacket Gap)。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。不管10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最少间隔时间计算方法如下: 10Mbit/s最小时间为:96100ns = 9600ns; 100Mbit/s最小时间为:9610ns = 960ns; 1000Mbit/s最小时间为:96*1ns = 96ns。 接下来我们介绍ARP协议以及它和以太网MAC层的关系。在介绍ARP协议之前,我们先了解下TCP(传输控制协议)/IP(网际协议)协议簇。TCP/IP是网络使用中最基本的通信协议,虽然从名字看上去TCP/IP包括两个协议,TCP和IP,但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:TCP、IP、ARP、UDP等。而TCP协议和IP协议是保证数据完整传输的两个重要的协议,因此TCP/IP协议用来表示Internet协议簇。 TCP/IP协议不仅可以运行在以太网上,也可以运行在FDDI(光纤分布式数据接口)和WLAN(无线局域网)上。反过来,以太网的高层协议不仅可以是TCP/IP协议,也可以是IPX协议(互联网分组交换协议)等,只不过以太网+TCP/IP成为IT行业中应用最普遍的技术。下面我们来熟悉下ARP协议。 ARP协议 ARP协议属于TCP/IP协议簇的一种,从前面介绍的图 28.1.4可以看出,ARP协议位于以太网MAC帧格式的数据段,ARP数据包格式如下图所示。

图 28.1.6 ARP数据包格式 硬件类型(Hardware type):硬件地址的类型,1表示以太网地址。 协议类型(Protocol type):要映射的协议地址类型,ARP协议的上层协议为IP协议,因此该协议类型为IP协议,其值为0x0800。 硬件地址长度(Hardware size):硬件地址(MAC地址)的长度,以字节为单位。对于以太网上IP地址的ARP请求或者应答来说,该值为6。 协议地址长度(Protocol size):IP地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或者应答来说,该值为4。 OP(Opcode):操作码,用于表示该数据包为ARP请求或者ARP应答。1表示ARP请求,2表示ARP应答。 源MAC地址:发送端的硬件地址。 源IP地址:发送端的协议(IP)地址,如192.168.1.102。 目的MAC地址:接收端的硬件地址,在ARP请求时由于不知道接收端MAC地址,因此该字段为广播地址,即48’hff_ff_ff_ff_ff_ff。 目的IP地址:接收端的协议(IP)地址,如192.168.1.10。 以太网的帧格式、ARP数据格式到这里已经全部介绍完了,关于通过以太网传输ARP报文的格式如下图所示:

图 28.1.7 以太网ARP数据包格式 由上图可知,28字节的ARP数据位于以太网帧格式的数据段。由于以太网数据段最少为46个字节,而ARP数据包总长度为28个字节,因此在ARP数据段后面需要填充18个字节的数据,以满足以太网传输格式的要求。这个填充的过程称为Padding(填充),填充的数据可以为任意值,但一般为0。 RGMII接口介绍 以太网的通信离不开物理层PHY芯片的支持,以太网MAC和PHY之间有一个接口,常用的接口有MII、RMII、GMII、RGMII等。 MII(Medium Independent Interface,媒体独立接口):MII支持10Mbps和100Mbps的操作,数据位宽为4位,在100Mbps传输速率下,时钟频率为25Mhz。 RMII(Reduced MII):RMII是MII的简化版,数据位宽为2位,在100Mbps传输速率下,时钟频率为50Mhz。 GMII(Gigabit MII):GMII接口向下兼容MII接口,支持10Mbps、100Mbps和1000Mbps的操作,数据位宽为8位,在1000Mbps传输速率下,时钟频率为125Mhz。 RGMII(Reduced GMII):RGMII是GMII的简化版,数据位宽为4位,在1000Mbps传输速率下,时钟频率为125Mhz,在时钟的上下沿同时采样数据。在100Mbps和10Mbps通信速率下,为单个时钟沿采样。 在千兆以太网中,常用的接口为RGMII和GMII接口。RGMII接口的优势是同时适用于10M/100M/1000Mbps通信速率,同时占用的引脚数较少。但RGMII接口也有其缺点,就是在PCB布线时需要尽可能对时钟、控制和数据线进行等长处理,且时序约束相对也更为严格。 为了节省引脚,DFZU2EG/4EV MPSoC开发板板载的PHY芯片采用的接口为RGMII接口,下图是MAC侧与PHY侧接口的连接。

图 28.1.8 MAC侧与PHY侧接口连接 ETH_RXC:接收数据参考时钟,1000Mbps速率下,时钟频率为125MHz,时钟为上下沿同时采样;100Mbps速率下,时钟频率为25MHz;10Mbps速率下,时钟频率为2.5MHz,ETH_RXC由PHY侧提供。 ETH_RXCTL(ETH_RX_DV):接收数据控制信号。 ETH_RXD:四位并行的接收数据线。 ETH_TXC:发送参考时钟,1000Mbps速率下,时钟频率为125MHz,时钟为上下沿同时采样;100Mbps速率下,时钟频率为25MHz;10Mbps速率下,时钟频率为2.5MHz,ETH_TXC由MAC侧提供。 ETH_TXCTL(ETH_TXEN):发送数据控制信号。 ETH_TXD:四位并行的发送数据线。 ETH_RESET_N:芯片复位信号,低电平有效。 ETH_MDC:数据管理时钟(Management Data Clock),该引脚对ETH_MDIO信号提供了一个同步的时钟。 ETH_MDIO:数据输入/输出管理(Management Data Input/Output),该引脚提供了一个双向信号用于传递管理信息。 其中ETH_RXC、ETH_RXCTL和ETH_RXD为MAC接收侧引脚;ETH_TXC、ETH_TXCTL和ETH_TXD为MAC发送侧引脚;ETH_MDC和ETH_MDIO为MDIO接口引脚,用于配置PHY芯片内部寄存器;ETH_RST_N为PHY芯片硬件复位信号。由于PHY芯片的内部寄存器在默认配置下也可以正常工作,因此本次实验没有对MDIO接口进行读写操作,只用到了以太网的RGMII接口信号和复位信号。 RGMII使用4bit数据接口,在1000Mbps通信速率下,ETH_TXC和ETH_RXC的时钟频率为125Mhz,采用上下沿DDR(Double Data Rate)的方式在一个时钟周期内传输8位数据信号,即上升沿发送/接收低4位数据,下降沿发送/接收高4位数据。ETH_TXCTL和ETH_RXCTL控制信号同样采用DDR的方式在一个时钟周期内传输两位控制信号,即上升沿发送/接收数据使能(TX_EN/RX_DV)信号,下降沿发送/接收使能信号与错误信号的异或值(TX_ERR xor TX_EN、RX_ERR xor RX_DV)。当RX_DV为高电平(表示数据有效),RX_ERR为低电平(表示数据无错误),则异或的结果值为高电平,因此只有当ETH_RXCTL和ETH_TXCTL信号的上下沿同时为高电平时,发送和接收的数据有效且正确。 当RGMII工作在100Mbps时,ETH_TXC和ETH_RXC的时钟频率为25Mhz,采用上升沿SDR的方式在一个周期内传输4位数据。不过此时ETH_TXCTL和ETH_RXCTL控制信号仍采用上下沿DDR的传输方式。 当RGMII工作在10Mbps时,ETH_TXC和ETH_RXC的时钟频率为2.5Mhz,采用上升沿SDR的方式在一个周期内传输4位数据。ETH_TXCTL和ETH_RXCTL控制信号也采用SDR的传输方式。 RGMII接口时序 PHY芯片的RGMII接口时序,其时钟、控制信号和数据的对齐方式,一般由MDIO接口或者硬件上的特殊引脚进行配置。 RGMII接收端口时钟、控制信号和数据对齐的时序图如下:

图 28.1.9 RGMII接收端口信号对齐 由上图可知,RXC的上下边沿与RXD和RX_CTL信号对齐,相位相同。 RGMII接收端口时钟和控制/数据信号增加延时的时序图如下:

图 28.1.10 RGMII接收信号增加时钟延时 由上图可知,RXC的上下边沿与RXD和RX_CTL信号的中间位置对齐,RXC的时钟周期为8ns,单个高电平或者低电平为4ns,RXC相对于RXD和RX_CTL延时约2ns。 YT8521 RGMII接收端口的信号对齐模式由硬件上的特殊引脚外接上下拉电阻进行配置,如图 28.1.11所示。从下图中可以看出,当管脚RXDLY(RXD0)接上拉电阻时,表示RXC时钟相对于RXD信号,会增加约2ns的延时。而DFZU2EG/4EV MPSoC开发板硬件原理图中YT8521的管脚RXDLY(RXD0)连接的是上拉电阻,因此RXC和RXD之间会有约2ns的延时,RGMII接收端口的时序图如图 28.1.10所示。

图 28.1.11 RGMII接收端口模式配置

图 28.1.12 YT8521 引脚分配 RGMII发送端口正常模式时序图如下:

图 28.1.13 RGMII发送端口正常模式 由上图可知,RGMII发送端口正常模式下,需要满足TXC的上下边沿与TXD和TX_CTL信号对齐,相位相同。YT8521在硬件上面没有做TX端的delay模式,可根据实际情况,选择是否在代码中进行延时(因为一般对端设备的接收端会有延时处理的功能,因此发送端也可以不延时),延时后的时序图如下所示:

图 28.1.14 RGMII发送端口延时模式 由RGMII的接口时序可知,RGMII发送端口在TXC时钟的上升沿传输TXD的低4位和TX_CTL的使能信号;下降沿传输TXD的高4位和TX_CTL的错误信号(实际上是使能信号和错误信号的异或值);RGMII接收端口在RXC时钟的上升沿传输RXD的低4位和RX_CTL的使能信号;下降沿传输RXD的高4位和RX_CTL的错误信号(实际上是使能信号和错误信号的异或值)。 Xilinx原语 原语是Xilinx器件底层硬件中的功能模块,它使用专用的资源来实现一系列的功能。相比于IP核,原语的调用方法更简单,但是一般只用于实现一些简单的功能。本章主要用到了BUFG、BUFIO、IDDRE1、ODDRE1、IDELAYE3和IDELAYCTRL。 BUFG:全局缓冲,BUFG的输出到达FPGA内部的IOB、CLB、块RAM的时钟延迟和抖动最小。BUFG原语模板如下: BUFG BUFG_inst ( .O(O), // 1-bit output: Clock output .I(I) // 1-bit input: Clock input ); 除了BUFG外,常用的还有BUFR,BUFR是regional时钟网络,它的驱动范围只能局限在一个clock region的逻辑。BUFR相比BUFG的最大优势是偏斜和功耗都比较小。 BUFIO:BUFIO是IO时钟网络,其独立于全局时钟资源,适合采集源同步数据。它只能驱动IO Block里面的逻辑,不能驱动CLB里面的LUT,REG等逻辑。BUFIO原语模板如下: BUFIO BUFIO_inst ( .O(O), // 1-bit output: Clock output (connect to I/O clock loads). .I(I) // 1-bit input: Clock input (connect to an IBUF or BUFMR). ); BUFIO在采集源同步IO数据时,提供非常小的延时,因此非常适合采集比如RGMII接收侧的数据,但是由于其不能驱动FPGA的内部逻辑,因此需要BUFIO和BUFG配合使用,以达到最佳性能。如ETH_RXC的时钟经过BUFIO,用来采集端口数据;ETH_RXC经过BUFG,用来作为除端口采集外的其他模块的操作时钟。 IDDRE1:在UltraScale系列设备的ILOGIC block中有专属的registers来实现input double-data-rate(IDDRE1) registers,将输入的上下边沿DDR信号,转换成两位单边沿SDR信号。IDDR的原语结构图如下图所示:

图 28.1.15 IDDRE1原语结构图 C:输入的高速时钟; D:输入的1位DDR数据; Q1和Q2:分别是“C”时钟上升沿和下降沿同步输出的SDR数据; CB:高速时钟C的反转; R:置位/复位信号,高有效; IDDRE1原语模板如下:

IDDRE1 #( .DDR_CLK_EDGE("OPPOSITE_EDGE"), // IDDRE1 mode (OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED) .IS_CB_INVERTED(1'b0), // Optional inversion for CB .IS_C_INVERTED(1'b0) // Optional inversion for C ) IDDRE1_inst ( .Q1(Q1), // 1-bit output: Registered parallel output 1 .Q2(Q2), // 1-bit output: Registered parallel output 2 .C(C), // 1-bit input: High-speed clock .CB(CB), // 1-bit input: Inversion of High-speed clock C .D(D), // 1-bit input: Serial Data Input .R(R) // 1-bit input: Active High Async Reset );

DDR_CLK_EDGE参数为IDDRE1的三种采集模式,分别为“OPPOSITE_EDGE”、“SAME_EDGE”和“SAME_EDGE_PIPELINED”模式。 OPPOSITE_EDGE模式的时序图如下图所示:

图 28.1.16 IDDRE1“OPPOSITE_EDGE”模式时序图 OPPOSITE_EDGE模式下,在时钟的上升沿输出的Q1,时钟的下降沿输出Q2。 SAME_EDGE模式的时序图如下图所示:

图 28.1.17 IDDRE1“SAME_EDGE”模式时序图 SAME_EDGE模式下,在时钟的上升沿输出Q1和Q2,但Q1和Q2不在同一个cycle输出。 SAME_EDGE_PIPELINED模式的时序图如下图所示:

图 28.1.18 IDDRE1“SAME_EDGE_PIPELINED”模式时序图 SAME_EDGE_PIPELINED模式下,在时钟的上升沿输出Q1和Q2,Q1和Q2虽然在同一个cycle输出,但整体延时了一个时钟周期。在使用IDDRE1时,一般采用此种模式。 ODDRE1:通过ODDRE1把两路单端的数据合并到一路上输出,上下沿同时输出数据,上升沿输出a路,下降沿输出b路;如果两路输入信号一路固定为1,另外一路固定为0,那么输出的信号实际上是时钟信号。 ODDRE1的原语结构图如下图所示:

图 28.1.19 ODDRE1原语结构图 C:输入的高速时钟; Q:输出的1位DDR数据; D1和D2:分别是“C”时钟上升沿和下降沿同步输入的SDR数据。 SR:置位/复位信号,高有效 ODDRE1原语模板如下:

ODDRE1 #( .IS_C_INVERTED(1'b0), // Optional inversion for C .IS_D1_INVERTED(1'b0), // Unsupported, do not use .IS_D2_INVERTED(1'b0), // Unsupported, do not use .SIM_DEVICE("ULTRASCALE"), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,ULTRASCALE_PLUS_ES2, VERSAL, VERSAL_ES1, VERSAL_ES2) .SRVAL(1'b0) //Initializes the ODDRE1 Flip-Flops to the specified value (1'b0, 1'b1) ) ODDRE1_inst ( .Q(Q), // 1-bit output: Data output to IOB .C(C), // 1-bit input: High-speed clock input .D1(D1), // 1-bit input: Parallel data input 1 .D2(D2), // 1-bit input: Parallel data input 2 .SR(SR) // 1-bit input: Active High Async Reset );

SIM_DEVICE参数为ODDRE1的七种设备版本,分别为UltraScale、UltraScale Plus、UltraScale Plus ES1、UltraScale Plus ES2、Versal、Versal ES1、Versal ES2。 28.2实验任务 本节实验任务是使用DFZU2EG/4EV MPSoC开发板上的PL端以太网接口,和上位机实现ARP请求和应答的功能。当上位机发送ARP请求时,开发板返回ARP应答数据。当按下开发板的PL Key1按键时,开发板发送ARP请求,此时上位机返回应答数据。 28.3硬件设计 PL端千兆以太网接口部分的硬件设计原理和“MDIO接口读写测试实验” 完全相同,请参考“MDIO接口读写测试实验”中的硬件设计部分。 本实验中,各端口信号的管脚分配如下表所示: 表 28.3.1 以太网ARP测试实验管脚分配

对应的XDC约束语句如下所示: #时钟周期约束 create_clock -name sys_clk_p -period 10.000 [get_ports sys_clk_p] create_clock -period 8.000 -name eth_rxc [get_ports eth_rxc]

#IO管脚约束 set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_p] set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_n] set_property PACKAGE_PIN AE5 [get_ports sys_clk_p] set_property PACKAGE_PIN AF5 [get_ports sys_clk_n] set_property -dict {PACKAGE_PIN AH11 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

set_property -dict {PACKAGE_PIN AD11 IOSTANDARD LVCMOS33} [get_ports key]

set_property -dict {PACKAGE_PIN E5 IOSTANDARD LVCMOS18} [get_ports eth_rxc] set_property -dict {PACKAGE_PIN D5 IOSTANDARD LVCMOS18} [get_ports eth_rx_ctl] set_property -dict {PACKAGE_PIN G6 IOSTANDARD LVCMOS18} [get_ports {eth_rxd[0]}] set_property -dict {PACKAGE_PIN F6 IOSTANDARD LVCMOS18} [get_ports {eth_rxd[1]}] set_property -dict {PACKAGE_PIN G8 IOSTANDARD LVCMOS18} [get_ports {eth_rxd[2]}] set_property -dict {PACKAGE_PIN F7 IOSTANDARD LVCMOS18} [get_ports {eth_rxd[3]}]

set_property -dict {PACKAGE_PIN D6 IOSTANDARD LVCMOS18} [get_ports eth_txc] set_property -dict {PACKAGE_PIN F8 IOSTANDARD LVCMOS18} [get_ports eth_tx_ctl] set_property -dict {PACKAGE_PIN D7 IOSTANDARD LVCMOS18} [get_ports {eth_txd[0]}] set_property -dict {PACKAGE_PIN E8 IOSTANDARD LVCMOS18} [get_ports {eth_txd[1]}] set_property -dict {PACKAGE_PIN E9 IOSTANDARD LVCMOS18} [get_ports {eth_txd[2]}] set_property -dict {PACKAGE_PIN D9 IOSTANDARD LVCMOS18} [get_ports {eth_txd[3]}] 28.4程序设计 根据实验任务,我们可以大致规划出系统的控制流程:首先我们需要完成RGMII接口数据和GMII接口数据的转换,以方便数据的采集和解析,在数据采集过程中所用到的延时原语参考时钟由锁相环输出的时钟提供;其次整个以太网帧格式与ARP协议的实现由ARP顶层模块完成;ARP控制模块负责检测输入的按键是否被按下,控制ARP顶层模块发起请求与产生应答等操作。由此画出系统的功能框图如下图所示:

图 28.4.1 以太网ARP测试系统框图 GMII TO RGMII模块负责将双沿(DDR)数据和单沿(SDR)数据之间的转换;ARP顶层模块实现了以太网ARP数据包的接收、发送以及CRC校验的功能;ARP控制模块根据输入的PL Key1按键信号和接收到的ARP请求信号,控制ARP顶层模块发送ARP请求或者ARP应答。 各模块端口及信号连接如下图所示:

图 28.4.2 顶层模块原理图 由上图可知,FPGA顶层模块例化了以下四个模块,GMII TO RGMII模块(gmii_to_rgmii)、时钟模块、ARP顶层模块(arp)和ARP控制模块(arp_ctrl),实现了各模块之间的数据交互。 其中ARP顶层模块和GMII TO RGMII模块内部也例化了多个其它模块,这样设计的目的是为了方便模块的重用。 顶层模块的代码如下:

1 module eth_arp_test( 2 input sys_clk_p , 3 input sys_clk_n , 4 input sys_rst_n , //系统复位信号,低电平有效 5 input key , //PL功能按键1,用于触发开发板发出ARP请求 6 //PL以太网RGMII接口 7 input eth_rxc , //RGMII接收数据时钟 8 input eth_rx_ctl, //RGMII输入数据有效信号 9 input [3:0] eth_rxd , //RGMII输入数据 10 output eth_txc , //RGMII发送数据时钟 11 output eth_tx_ctl, //RGMII输出数据有效信号 12 output [3:0] eth_txd //RGMII输出数据 13 ); 14 15 //parameter define 16 //开发板MAC地址 00-11-22-33-44-55 17 parameter BOARD_MAC = 48'h00_11_22_33_44_55; 18 //开发板IP地址 192.168.1.10 19 parameter BOARD_IP = {8'd192,8'd168,8'd1,8'd10}; 20 //目的MAC地址 ff_ff_ff_ff_ff_ff 21 parameter DES_MAC = 48'hff_ff_ff_ff_ff_ff; 22 //目的IP地址 192.168.1.102 23 parameter DES_IP = {8'd192,8'd168,8'd1,8'd102}; 24 25 //wire define 26 wire gmii_rx_clk; //GMII接收时钟 27 wire gmii_rx_dv ; //GMII接收数据有效信号 28 wire [7:0] gmii_rxd ; //GMII接收数据 29 wire gmii_tx_clk; //GMII发送时钟 30 wire gmii_tx_en ; //GMII发送数据使能信号 31 wire [7:0] gmii_txd ; //GMII发送数据 32 33 wire arp_rx_done; //ARP接收完成信号 34 wire arp_rx_type; //ARP接收类型 0:请求 1:应答 35 wire [47:0] src_mac ; //接收到目的MAC地址 36 wire [31:0] src_ip ; //接收到目的IP地址 37 wire arp_tx_en ; //ARP发送使能信号 38 wire arp_tx_type; //ARP发送类型 0:请求 1:应答 39 wire tx_done ; //发送的目标MAC地址 40 wire [47:0] des_mac ; //发送的目标IP地址 41 wire [31:0] des_ip ; //以太网发送完成信号 42 43 //***************************************************** 44 //** main code 45 //***************************************************** 46 47 assign des_mac = src_mac; 48 assign des_ip = src_ip ; 49 assign eth_txc = clk_125m_deg; 50 51 clk_wiz_0 u_clk_wiz_0 52 ( 53 // Clock out ports 54 .clk_out1 (clk_125m_deg ), // output clk_out1 55 // Status and control signals 56 .reset (~sys_rst_n ), // input reset 57 .locked (locked ), // output locked 58 // Clock in ports 59 .clk_in1 (rgmii_txc ) // input clk_in1 60 ); 61 62 //GMII接口转RGMII接口 63 gmii_to_rgmii u_gmii_to_rgmii( 64 .gmii_rx_clk (gmii_rx_clk ), 65 .gmii_rx_dv (gmii_rx_dv ), 66 .gmii_rxd (gmii_rxd ), 67 .gmii_tx_clk (gmii_tx_clk ), 68 .gmii_tx_en (gmii_tx_en ), 69 .gmii_txd (gmii_txd ), 70 71 .rgmii_rxc (eth_rxc ), 72 .rgmii_rx_ctl (eth_rx_ctl ), 73 .rgmii_rxd (eth_rxd ), 74 .rgmii_txc (rgmii_txc ), 75 .rgmii_tx_ctl (eth_tx_ctl ), 76 .rgmii_txd (eth_txd ) 77 ); 78 79 //ARP通信 80 arp 81 #( 82 .BOARD_MAC (BOARD_MAC), //参数例化 83 .BOARD_IP (BOARD_IP ), 84 .DES_MAC (DES_MAC ), 85 .DES_IP (DES_IP ) 86 ) 87 u_arp( 88 .rst_n (sys_rst_n ), 89 90 .gmii_rx_clk (gmii_rx_clk), 91 .gmii_rx_dv (gmii_rx_dv ), 92 .gmii_rxd (gmii_rxd ), 93 .gmii_tx_clk (gmii_tx_clk), 94 .gmii_tx_en (gmii_tx_en ), 95 .gmii_txd (gmii_txd ), 96 97 .arp_rx_done (arp_rx_done), 98 .arp_rx_type (arp_rx_type), 99 .src_mac (src_mac ), 100 .src_ip (src_ip ), 101 .arp_tx_en (arp_tx_en ), 102 .arp_tx_type (arp_tx_type), 103 .des_mac (des_mac ), 104 .des_ip (des_ip ), 105 .tx_done (tx_done ) 106 ); 107 108 //ARP控制 109 arp_ctrl u_arp_ctrl( 110 .clk (gmii_rx_clk), 111 .rst_n (sys_rst_n ), 112 113 .key (key ), 114 .arp_rx_done (arp_rx_done), 115 .arp_rx_type (arp_rx_type), 116 .arp_tx_en (arp_tx_en ), 117 .arp_tx_type (arp_tx_type) 118 ); 119 120 endmodule

顶层模块主要完成对其余模块的例化。在程序的第15行至第23行代码定义了开发板的MAC地址、IP地址、默认的目的MAC地址和目的IP地址。开发板的MAC地址为00:11:22:33:44:55;开发板的IP地址为192.168.1.10;默认目的MAC地址为ff:ff:ff:ff:ff:ff,这是一个广播MAC地址,在收到上位机的请求或者应答之后,ARP模块会替换成实际的目的MAC地址。目的IP地址这里设置为192.168.1.102,因此大家在做本次实验时,需要把电脑的以太网的IP地址改成192.168.1.102,或者将代码中定义的DES_IP改成电脑的IP地址。 程序的第47行和48行代码将收到的对端设备MAC地址和目的IP地址,作为开发板发送时的目的MAC地址和IP地址。 gmii_to_rgmii模块代码如下:

1 module gmii_to_rgmii( 2 //以太网GMII接口 3 output gmii_rx_clk , //GMII接收时钟 4 output gmii_rx_dv , //GMII接收数据有效信号 5 output [7:0] gmii_rxd , //GMII接收数据 6 output gmii_tx_clk , //GMII发送时钟 7 input gmii_tx_en , //GMII发送数据使能信号 8 input [7:0] gmii_txd , //GMII发送数据 9 //以太网RGMII接口 10 input rgmii_rxc , //RGMII接收时钟 11 input rgmii_rx_ctl, //RGMII接收数据控制信号 12 input [3:0] rgmii_rxd , //RGMII接收数据 13 output rgmii_txc , //RGMII发送时钟 14 output rgmii_tx_ctl, //RGMII发送数据控制信号 15 output [3:0] rgmii_txd //RGMII发送数据 16 ); 17 18 //***************************************************** 19 //** main code 20 //***************************************************** 21 22 assign gmii_tx_clk = gmii_rx_clk; 23 24 //RGMII接收 25 rgmii_rx u_rgmii_rx( 26 .gmii_rx_clk (gmii_rx_clk ), 27 .rgmii_rxc (rgmii_rxc ), 28 .rgmii_rx_ctl (rgmii_rx_ctl), 29 .rgmii_rxd (rgmii_rxd ), 30 31 .gmii_rx_dv (gmii_rx_dv ), 32 .gmii_rxd (gmii_rxd ) 33 ); 34 35 //RGMII发送 36 rgmii_tx u_rgmii_tx( 37 .gmii_tx_clk (gmii_tx_clk ), 38 .gmii_tx_en (gmii_tx_en ), 39 .gmii_txd (gmii_txd ), 40 41 .rgmii_txc (rgmii_txc ), 42 .rgmii_tx_ctl (rgmii_tx_ctl), 43 .rgmii_txd (rgmii_txd ) 44 ); 45 46 endmodule

由该模块的端口可知,该模块实现了双沿(DDR)数据和单沿(SDR)数据之间的转换。程序中第22行将GMII接收时钟赋值给GMII发送时钟,因此GMII的发送时钟和接收时钟实际上为同一个时钟。GMII TO RGMII模块例化了rgmii_rx模块和rgmii_tx模块。 rgmii_rx模块代码如下所示:

1 module rgmii_rx( 2 //以太网RGMII接口 3 input rgmii_rxc , //RGMII接收时钟 4 input rgmii_rx_ctl, //RGMII接收数据控制信号 5 input [3:0] rgmii_rxd , //RGMII接收数据 6 7 //以太网GMII接口 8 output gmii_rx_clk , //GMII接收时钟 9 output gmii_rx_dv , //GMII接收数据有效信号 10 output [7:0] gmii_rxd //GMII接收数据 11 ); 12 13 //wire define 14 wire rgmii_rxc_bufg; //全局时钟缓存 15 wire rgmii_rxc_bufio; //全局时钟IO缓存 16 wire [1:0] gmii_rxdv_t; //两位GMII接收有效信号 17 18 //***************************************************** 19 //** main code 20 //***************************************************** 21 22 assign gmii_rx_clk = rgmii_rxc_bufg; 23 assign gmii_rx_dv = gmii_rxdv_t[0] & gmii_rxdv_t[1]; 24 25 //全局时钟缓存 26 BUFG BUFG_inst ( 27 .I (rgmii_rxc), // 1-bit input: Clock input 28 .O (rgmii_rxc_bufg) // 1-bit output: Clock output 29 ); 30 31 //全局时钟IO缓存 32 BUFIO BUFIO_inst ( 33 .I (rgmii_rxc), // 1-bit input: Clock input 34 .O (rgmii_rxc_bufio) // 1-bit output: Clock output 35 ); 36 37 //将输入的上下边沿DDR信号,转换成两位单边沿SDR信号 38 IDDRE1 #( 39 .DDR_CLK_EDGE ("SAME_EDGE_PIPELINED"), 40 // IDDRE1 mode (OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED) 41 .IS_CB_INVERTED (1'b0), // Optional inversion for CB 42 .IS_C_INVERTED (1'b0) // Optional inversion for C 43 ) 44 IDDRE1_inst ( 45 .Q1 (gmii_rxdv_t[0]), // 1-bit output: Registered parallel output 1 46 .Q2 (gmii_rxdv_t[1]), // 1-bit output: Registered parallel output 2 47 .C (rgmii_rxc_bufio), // 1-bit input: High-speed clock 48 .CB (~rgmii_rxc_bufio),// 1-bit input: Inversion of High-speed clock C 49 .D (rgmii_rx_ctl), // 1-bit input: Serial Data Input 50 .R (1'b0) // 1-bit input: Active High Async Reset 51 ); 52 53 genvar i; 54 generate for (i=0; isrc_ip_t[23:0],gmii_rxd}; 197 else if(cnt >= 5'd24 && cnt < 5'd28) //目标IP地址 198 des_ip_t ~crc_next[0], ~crc_next[1], ~crc_next[2],~crc_next[3], 288 ~crc_next[4], ~crc_next[5], ~crc_next[6],~crc_next[7]}; 289 else if(cnt == 6'd1) 290 gmii_txd ~crc_data[8], ~crc_data[9], ~crc_data[10], 295 ~crc_data[11],~crc_data[12], ~crc_data[13], 296 ~crc_data[14],~crc_data[15]}; 297 end 298 else if(cnt == 6'd3) begin 299 gmii_txd


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有